package com.grupobbva.seguridad.client.filter;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.grupobbva.seguridad.client.domain.Usuario;
import com.grupobbva.seguridad.client.domain.UsuarioAplicacion;
import com.grupobbva.seguridad.client.service.SeguridadService;
import com.grupobbva.seguridad.client.util.Constante;

public class SessionFilter implements Filter {
	
	public FilterConfig config;

    public SessionFilter() {
        
    }

	public void destroy() {
		
	}
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpSession sesion = ((HttpServletRequest)request).getSession();
		String     mensaje = "";
		try {
			if(sesion.getAttribute(Constante.SESSION_USUARIO) == null) {
				String aplicacionId = request.getParameter(Constante.REQUEST_APLICACION_ID);
				String usuarioId = request.getParameter(Constante.REQUEST_USUARIO_ID);
				if(aplicacionId == null || usuarioId == null || aplicacionId.trim().equals("") || usuarioId.trim().equals("")) {
					throw new Exception("Faltan ingresar los datos del usuario y aplicacion");
				}
				Usuario usuario = SeguridadService.validarUsuario(Long.parseLong(aplicacionId), usuarioId);
				sesion.setAttribute(Constante.SESSION_USUARIO, usuario);
				
				List<UsuarioAplicacion> usuariosAplicacion = SeguridadService.validarUsuariosAplicacion(Long.parseLong(aplicacionId), usuarioId);
				sesion.setAttribute(Constante.USUARIOS_APLICACION, usuariosAplicacion);
			}
		} catch(Exception e) {
			mensaje = e.getMessage();
			e.printStackTrace();
		}
		if(sesion.getAttribute(Constante.SESSION_USUARIO) == null) {
			response.setContentType("text/html");
			PrintWriter out = response.getWriter();
			out.write("<center>La validacion del usuario no fue satisfactoria por el siguiente motivo: "+mensaje+"</center>");
			out.close();
		}
		chain.doFilter(request, response);
	}

	public void init(FilterConfig fConfig) throws ServletException {
		this.config = fConfig;

		String jndi = config.getInitParameter(Constante.PARA_JNDI_SEGURIDAD);
		String esqu = config.getInitParameter(Constante.PARA_ESQU_SEGURIDAD);
		
		Constante.JNDI_SEGURIDAD = ((jndi != null && !jndi.trim().equals(""))?jndi:Constante.JNDI_SEGURIDAD);
		Constante.ESQUEMA_SEGURIDAD = ((esqu != null && !esqu.trim().equals(""))?esqu:Constante.ESQUEMA_SEGURIDAD);
	}
}
